package controller

import (
	"fmt"
	"ginessential/common"
	"ginessential/model"
	"net/http"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

//管理员登录页面
func Ad_Login(c *gin.Context) {
	DB := common.GetDB()
	//request := make(map[string]interface{}) //新建一个map类型的变量request，保存前端传来的数据
	// request := make(map[string]string) //新建一个map类型的变量request，保存前端传来的数据

	var test = model.Student{}
	//获取参数
	c.ShouldBind(&test) //将前端传过来的数据绑定到该request上
	/*
		test.Stu_id = request["id"].(string) //取得相应的map值 放到结构体上
		test.Stu_password = request["password"].(string)
	*/

	fmt.Println("id为")
	fmt.Println(test.Stu_id)
	fmt.Println("密码为")
	fmt.Println(test.Stu_password)

	// 查询管理员是否存在(链接数据库查)
	if Find_Ad(DB, test) {
		fmt.Println("成功查找到该管理员，可以登录")
		c.JSON(200, gin.H{
			"code": "200",
			"msg":  "ok",
		})
		// 开启登录成功后的主页面
	} else {
		c.JSON(404, gin.H{
			"code": "404",
			"msg":  "no",
		})
		fmt.Println("该用户名或密码错误或权限不足，不能登录！")
	}
}

//管理员（学生）登录 (页面用)
func Student_Login(c *gin.Context) {
	DB := common.GetDB()
	//request := make(map[string]interface{}) //新建一个map类型的变量request，保存前端传来的数据
	var test = model.Student{}
	//获取参数
	//fmt.Println(request)
	c.ShouldBind(&test) //将前端传过来的数据绑定到该request上
	//fmt.Println(request)
	//test.Stu_id = request["id"].(string) //取得相应的map值 放到结构体上
	//test.Stu_password = request["password"].(string)
	fmt.Println("id为")
	fmt.Println(test.Stu_id)
	fmt.Println("密码为")
	fmt.Println(test.Stu_password)

	// 查询管理员是否存在(链接数据库查)
	if Find_Student(DB, test) {
		fmt.Println("成功查找到该学生，可以登录")
		c.JSON(200, gin.H{
			"code": "200",
			"msg":  "ok",
		})
		// 开启登录成功后的主页面
	} else {
		c.JSON(404, gin.H{
			"code": "404",
			"msg":  "no",
		})
		fmt.Println("该用户名或密码错误或权限不足，不能登录！")
	}
}

//找到所有学生信息，并传回到网页上 （页面用）
func E_Set_All_Students(c *gin.Context) {
	DB := common.GetDB()
	var all_students []model.Student //结构体数组
	// 显示所有的学生信息
	result := DB.Table("students").Find(&all_students)
	if result != nil {
		fmt.Println("!!")
	}
	fmt.Println(all_students)
	c.JSON(http.StatusOK, gin.H{ //多传一些参数 可能会用到
		"code": "200",
		"stus": all_students, //试试传一个列表
		"msg":  "成功",
	})
}

//查找某一指定学生信息(网页用)
func E_Get_Student(c *gin.Context) {
	DB := common.GetDB()
	var test = model.Student{}
	var test2 []model.Student
	//request := make(map[string]interface{}) //新建一个map类型的变量request，保存前端传来的数据
	//获取参数
	//fmt.Println(request)
	c.ShouldBind(&test) //将前端传过来的数据绑定到该request上
	//fmt.Println(request)
	//test.Stu_id = request["id"].(string) //取得相应的map值 放到结构体上
	// 查询用户是否存在(链接数据库查)
	DB.Where("stu_id = ?", test.Stu_id).First(&test2)
	if test2[0].Stu_id != "" {
		fmt.Println("成功查找到该学生")
		c.JSON(200, gin.H{
			"code":     "200",
			"students": test2, //传一个对象
			"msg":      "成功",
		})
	} else {
		c.JSON(404, gin.H{
			"code":     "404",
			"students": test2, //传一个空对象
			"msg":      "no",
		})
		fmt.Println("未找到该学生")
	}
}

//增加学生（页面用）
func E_Add_Student(c *gin.Context) {
	DB := common.GetDB()
	request := make(map[string]interface{}) //新建一个map类型的变量request，保存前端传来的数据
	c.ShouldBind(&request)                  //将前端传过来的数据绑定到该request上
	var test model.Student
	test.Stu_id = request["stu_id"].(string)             //获取前端的要增加的学生的属性
	test.Stu_name = request["stu_name"].(string)         //获得姓名
	test.Stu_password = request["stu_password"].(string) //获得密码
	test.Stu_class = request["stu_class"].(string)
	test.Stu_level = request["stu_level"].(string)
	test.Stu_type = request["stu_type"].(string)
	test.Stu_date, _ = request["stu_date"].(string)
	fmt.Println(request)
	//获取到新增学生的所有信息
	if Insert_Student(DB, test) {
		//没找到，可以新建该学生
		c.JSON(200, gin.H{
			"code": "200",
			"msg":  "添加成功",
		})
		fmt.Println("添加成功")
	} else {
		//能找到，就不可以新建该学生
		c.JSON(404, gin.H{
			"code": "404",
			"msg":  "添加失败",
		})
		fmt.Println("添加失败")
	}
}

//删除指定学生（页面用）
func E_Delete_Student(c *gin.Context) {
	DB := common.GetDB()
	request := make(map[string]interface{}) //新建一个map类型的变量request，保存前端传来的数据
	c.ShouldBind(&request)                  //将前端传过来的数据绑定到该request上
	var test model.Student
	test.Stu_id = request["stu_id"].(string) //获取前端的要删除的学生的id
	if Delete_Student(DB, test) {
		//删除成功
		c.JSON(200, gin.H{
			"code": "200",
			"msg":  "删除成功",
		})
		fmt.Println("删除成功")
	} else {
		//删除失败
		c.JSON(404, gin.H{
			"code": "404",
			"msg":  "删除失败",
		})
		fmt.Println("删除失败")
	}
}

//修改指定学生信息（页面用）
func E_Modify_Student(c *gin.Context) {
	DB := common.GetDB()
	request := make(map[string]interface{}) //新建一个map类型的变量request，保存前端传来的数据
	c.ShouldBind(&request)                  //将前端传过来的数据绑定到该request上
	var test model.Student
	test.Stu_id = request["stu_id"].(string)             //获取前端的要增加的学生的属性
	test.Stu_name = request["stu_name"].(string)         //获得姓名
	test.Stu_password = request["stu_password"].(string) //获得密码
	test.Stu_class = request["stu_class"].(string)
	test.Stu_level = request["stu_level"].(string)
	test.Stu_type = request["stu_type"].(string)
	test.Stu_date, _ = request["stu_date"].(string)
	//获取到全部修改信息

	if Modify_Student(DB, test) {
		c.JSON(200, gin.H{
			"code": "200",
			"msg":  "删除成功",
		})
	} else {
		c.JSON(404, gin.H{
			"code": "404",
			"msg":  "删除失败",
		})
	}
}

//管理员级别
//查询管理员是否存在（登陆用）

func Find_Ad(db *gorm.DB, test model.Student) bool {
	var student model.Student
	db.Where("stu_id = ? AND stu_password = ? AND stu_level = '0'", test.Stu_id, test.Stu_password).First(&student)
	if student.Stu_id != "" {
		fmt.Println(student.Stu_name)
		return true
	}
	return false
}

//学生登录
func Find_Student(db *gorm.DB, test model.Student) bool {
	var student model.Student
	db.Where("stu_id = ? AND stu_password = ?", test.Stu_id, test.Stu_password).First(&student)
	if student.Stu_id != "" {
		fmt.Println(student.Stu_name)
		return true
	}
	return false
}

//查询学生是否存在（新建学生用）
func Find_Student_2(db *gorm.DB, test model.Student) bool {
	var student model.Student
	db.Where("stu_id = ?", test.Stu_id).First(&student)
	if student.Stu_id != "" {
		fmt.Println(student.Stu_name)
		return true
	}
	return false
}

// 插入学生
func Insert_Student(db *gorm.DB, test model.Student) bool {
	if Find_Student_2(db, test) {
		fmt.Println("该学生已经存在了！不能插入!")
		return false
	} else {
		db.Create(&test)
		fmt.Println("插入成功")
		return true
	}
}

// 删除学生
func Delete_Student(db *gorm.DB, test model.Student) bool {
	if Find_Student_2(db, test) {
		fmt.Println("已经查找到该学生")
		db.Where("stu_id = ?", test.Stu_id).Delete(&test)
		return true
	} else {
		fmt.Println("并不存在该学生")
	}
	return false
}

// 修改学生
func Modify_Student(db *gorm.DB, test model.Student) bool {
	if Find_Student_2(db, test) {
		fmt.Println("已经查找到该学生")
		db.Model(&test).Where("stu_id = ?", test.Stu_id).Updates(
			model.Student{
				Stu_id:       test.Stu_id,
				Stu_name:     test.Stu_name,
				Stu_password: test.Stu_password,
				Stu_class:    test.Stu_class,
				Stu_level:    test.Stu_level,
				Stu_type:     test.Stu_type,
				Stu_date:     test.Stu_date,
			},
		)
		fmt.Println("修改完成")
		return true
	} else {
		fmt.Println("并不存在该学生")
	}
	return false
}
